package acwing._2LanQiao._9DP;
/**
 * @Project : AlgorithmLearning
 * @Package : ACWing._2LanQiao._9DP
 * @File : Q1220.java
 * @Author : WangRuoyu
 * @Date : 2023/3/23 17:21
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

// 链表存数组
public class Q1220 {

    static int n;
    static int[] w;
    static final int N = 1000010;
    static int[] h = new int[N];
    static int[] e = new int[N];
    static int[] ne = new int[N];
    static int idx = 0;
    static long[] f = new long[N];
    static long res = Long.MIN_VALUE;

    static void add(int a, int b) {
        e[idx] = b;
        ne[idx] = h[a];
        h[a] = idx++;
    }

    static void dfs(int u, int father) {
        f[u] = w[u];
        for (int i = h[u]; i != -1; i = ne[i]) {
            int j = e[i];
            if (j != father) {
                dfs(j, u);
                f[u] += Math.max(0L, f[j]);
            }
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] words = br.readLine().split(" ");

        n = Integer.parseInt(words[0]);
        w = new int[n + 1];
        words = br.readLine().split(" ");

        Arrays.fill(h, -1);

        for (int i = 1; i <= n; ++i) {
            w[i] = Integer.parseInt(words[i - 1]);
        }

        for (int i = 0; i < n - 1; ++i) {
            words = br.readLine().split(" ");
            int a = Integer.parseInt(words[0]);
            int b = Integer.parseInt(words[1]);
            add(a, b);
            add(b, a);
        }
        dfs(1, -1);

        long res = Long.MIN_VALUE;
        for (int i = 1; i <= n; i++) {
            res = Math.max(res, f[i]);
        }
        System.out.println(res);
    }
}

// 数组加Arraylist，邻接表存边
//public class Q1220 {
//
//    static int n;
//    static int[] d;
//    static ArrayList<Integer>[] edge;
//    static long res = Long.MIN_VALUE;
//
//    static long dfs(int x) {
//        long ans = d[x];
//        if (edge[x] != null) {
//            for (int i = 0; i < edge[x].size(); ++i) {
//                long dis = dfs(edge[x].get(i));
//                if (dis > 0) {
//                    ans += dis;
//                }
//            }
//        }
//        res = Math.max(res, ans);
//        return ans;
//    }
//
//    public static void main(String[] args) throws IOException {
//        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//        String[] words = br.readLine().split(" ");
//
//        n = Integer.parseInt(words[0]);
//        d = new int[n + 1];
//        edge = new ArrayList[n + 1];
//        words = br.readLine().split(" ");
//
//        for (int i = 1; i <= n; ++i) {
//            d[i] = Integer.parseInt(words[i - 1]);
//        }
//
//        for (int i = 0; i < n - 1; ++i) {
//            words = br.readLine().split(" ");
//            int a = Integer.parseInt(words[0]);
//            int b = Integer.parseInt(words[1]);
//            int x = Math.min(a, b);
//            int y = Math.max(a, b);
//
//            if (edge[x] == null) {
//                edge[x] = new ArrayList<>();
//            }
//            edge[x].add(y);
//        }
//        dfs(1);
//        System.out.println(res);
//    }
//}

